package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;

import clases.Premio;
import clases.Transaccion;
import clases.TransaccionConPremio;
import clases.casillas.Casilla;


public class AdministradorTransacciones
{
	private static AdministradorTransacciones instancia;
	
	
	private AdministradorTransacciones()
	{
		
	}
	
	public static AdministradorTransacciones getInstancia()
	{
		if (instancia == null)
			instancia = new AdministradorTransacciones();
		return instancia;
	}
	
	private String CON_PREMIO = "conpremio";
	private String TRAN_SIMPLE = "simple";

	public Vector<Transaccion> traerTodas() {
		
		Vector<Transaccion> transacciones = new Vector<Transaccion>();
		Connection con = null;
		
		try
		{
			con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select fecha, tipo, descripcion, monto, idPremio from Transacciones order by fecha");
			
			ResultSet rs = s.executeQuery();
			while (rs.next()) 
			{
				Date fechaTransaccion = rs.getDate("fecha");
				float monto = rs.getFloat("monto");
				String descripcion = rs.getString("descripcion");
				String tipo = rs.getString("tipo");
				
				Transaccion t = null;
				
				if (tipo == CON_PREMIO) {
					String idPremio = rs.getString("idPremio");
					Premio premio = AdministradorPremios.getInstancia().traerPremio(idPremio);
					
					t = new TransaccionConPremio(fechaTransaccion,
							monto,
							descripcion,
							traerCasillasDeLaJugada(fechaTransaccion),
							premio);
				}
				else {
					t = new Transaccion(fechaTransaccion,
							monto,
							descripcion,
							traerCasillasDeLaJugada(fechaTransaccion));	
				}
				
				transacciones.add(t);
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch (Exception e)
		{
			System.out.println();
		}
		finally {
			if (con != null)
				PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		
		
		return transacciones;
	}
	
	private ArrayList<Casilla> traerCasillasDeLaJugada(Date fechaTransaccion) {
		ArrayList<Casilla> casillasDeLaJugada = new ArrayList<Casilla>();
		Connection con = null;
		
		try
		{
			con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select casilla from CasillasJugada where fechaTransaccion = ?");
			s.setTimestamp(1, new java.sql.Timestamp(fechaTransaccion.getTime()));
			
			ResultSet rs = s.executeQuery();

			while (rs.next()) 
			{
				String nombreCasilla = rs.getString("casilla");
				
				Casilla casillaDelPremio = AdministradorCasilla.getInstancia().traer(nombreCasilla);
				
				casillasDeLaJugada.add(casillaDelPremio);
			}
			

		}
		catch (Exception e)
		{

			System.out.println(e.getMessage());
		}
		finally {
			if (con != null)
				PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		
		return casillasDeLaJugada;
	}
	
	public void insertar(Transaccion transaccion) {
		Connection con = null;
		
		try
		{
			con = PoolConnection.getPoolConnection().getConnection();
			
			PreparedStatement s = con.prepareStatement("insert into Transacciones (fecha, tipo, descripcion, monto, idPremio) VALUES (?, ?, ?, ?, ?)");
			
			s.setTimestamp(1, new java.sql.Timestamp(transaccion.getFecha().getTime()));
			s.setString(3, transaccion.getDescripcion());
			s.setFloat(4, transaccion.getMonto());
			
			if (transaccion instanceof TransaccionConPremio)
			{
				s.setString(2, CON_PREMIO);
				s.setString(5, (((TransaccionConPremio)transaccion).getPremio()).getId());
			}
			else {
				s.setString(2, TRAN_SIMPLE);
				s.setString(5, null);
			}
			
			s.execute();
			
			if (transaccion.getCasillas() != null) {
				for (Casilla casilla : transaccion.getCasillas()) {
					insertarCasillaDeLaJugada(transaccion.getFecha(), casilla);
				}
			}
		}
		catch (Exception e)
		{
			System.out.println();
		}
		finally {
			if (con != null)
				PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	}
	
	private void insertarCasillaDeLaJugada(Date fechaTransaccion, Casilla casilla) {
	
		Connection con = null;
		
		try
		{
			con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("insert into CasillasJugada (fechaTransaccion, casilla) VALUES (?, ?)");
			
			s.setTimestamp(1, new java.sql.Timestamp(fechaTransaccion.getTime()));
			s.setString(2, casilla.getNombre());

			s.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch (Exception e)
		{
			System.out.println();
		}
		finally {
			if (con != null)
				PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	}
}
